{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pathlib\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import pandas as pd\n",
    "import seaborn as sns\n",
    "\n",
    "import tensorflow as tf\n",
    "\n",
    "from tensorflow import keras\n",
    "from tensorflow.keras import layers\n",
    "\n",
    "import tensorflow_docs as tfdocs\n",
    "import tensorflow_docs.plots\n",
    "import tensorflow_docs.modeling"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 数据处理"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [],
   "source": [
    "# 加载数据\n",
    "dataset_path = keras.utils.get_file(\"auto-mpg.data\", \"http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data\")\n",
    "column_names = ['MPG','Cylinders','Displacement','Horsepower','Weight',\n",
    "                'Acceleration', 'Model Year', 'Origin']\n",
    "raw_dataset = pd.read_csv(dataset_path, names=column_names,\n",
    "                      na_values = \"?\", comment='\\t',\n",
    "                      sep=\" \", skipinitialspace=True)\n",
    "\n",
    "dataset = raw_dataset.copy()\n",
    "# 清洗数据\n",
    "dataset = dataset.dropna()\n",
    "dataset['Origin'] = dataset['Origin'].map({1: 'USA', 2: 'Europe', 3: 'Japan'})\n",
    "dataset = pd.get_dummies(dataset, prefix='', prefix_sep='')\n",
    "# dataset.tail()\n",
    "\n",
    "# 分割数据用于训练和测试\n",
    "train_dataset = dataset.sample(frac=0.8,random_state=0)\n",
    "test_dataset = dataset.drop(train_dataset.index)\n",
    "\n",
    "# 查看信息\n",
    "# sns.pairplot(train_dataset[[\"MPG\", \"Cylinders\", \"Displacement\", \"Weight\"]], diag_kind=\"kde\")\n",
    "train_stats = train_dataset.describe()\n",
    "train_stats.pop(\"MPG\")\n",
    "train_stats = train_stats.transpose()\n",
    "\n",
    "# 从特征中分割出标签\n",
    "train_labels = train_dataset.pop('MPG')\n",
    "test_labels = test_dataset.pop('MPG')\n",
    "def norm(x): # 归一化\n",
    "  return (x - train_stats['mean']) / train_stats['std']\n",
    "normed_train_data = norm(train_dataset)\n",
    "normed_test_data = norm(test_dataset)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 构建模型 "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Model: \"sequential_1\"\n",
      "_________________________________________________________________\n",
      "Layer (type)                 Output Shape              Param #   \n",
      "=================================================================\n",
      "dense_3 (Dense)              (None, 64)                640       \n",
      "_________________________________________________________________\n",
      "dense_4 (Dense)              (None, 64)                4160      \n",
      "_________________________________________________________________\n",
      "dense_5 (Dense)              (None, 1)                 65        \n",
      "=================================================================\n",
      "Total params: 4,865\n",
      "Trainable params: 4,865\n",
      "Non-trainable params: 0\n",
      "_________________________________________________________________\n",
      "\n",
      "Epoch: 0, loss:539.0601,  mae:21.9842,  mse:539.0601,  val_loss:517.0905,  val_mae:21.4926,  val_mse:517.0905,  \n",
      "....................................................................................................\n",
      "Epoch: 100, loss:5.9988,  mae:1.7347,  mse:5.9988,  val_loss:8.4993,  val_mae:2.1923,  val_mse:8.4993,  \n",
      "....................................................................................................\n",
      "Epoch: 200, loss:5.6859,  mae:1.6331,  mse:5.6859,  val_loss:8.5669,  val_mae:2.0911,  val_mse:8.5669,  \n",
      "....................................................................................................\n",
      "Epoch: 300, loss:5.3015,  mae:1.5733,  mse:5.3015,  val_loss:8.2302,  val_mae:2.1971,  val_mse:8.2302,  \n",
      "....................................................................................................\n",
      "Epoch: 400, loss:4.4643,  mae:1.4200,  mse:4.4643,  val_loss:8.3005,  val_mae:2.2060,  val_mse:8.3005,  \n",
      "....................................................................................................\n",
      "Epoch: 500, loss:4.3842,  mae:1.4072,  mse:4.3842,  val_loss:8.7317,  val_mae:2.1889,  val_mse:8.7317,  \n",
      "....................................................................................................\n",
      "Epoch: 600, loss:3.7691,  mae:1.3005,  mse:3.7691,  val_loss:8.5335,  val_mae:2.2075,  val_mse:8.5335,  \n",
      "....................................................................................................\n",
      "Epoch: 700, loss:3.3423,  mae:1.2684,  mse:3.3423,  val_loss:8.3822,  val_mae:2.1774,  val_mse:8.3822,  \n",
      "....................................................................................................\n",
      "Epoch: 800, loss:3.2306,  mae:1.1572,  mse:3.2306,  val_loss:8.2274,  val_mae:2.1812,  val_mse:8.2274,  \n",
      "....................................................................................................\n",
      "Epoch: 900, loss:2.7849,  mae:1.0887,  mse:2.7849,  val_loss:8.7723,  val_mae:2.1753,  val_mse:8.7723,  \n",
      "...................................................................................................."
     ]
    },
    {
     "data": {
      "text/plain": [
       "Text(0, 0.5, 'MSE [MPG^2]')"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 1. 模型结构\n",
    "def build_model():\n",
    "  model = keras.Sequential([\n",
    "    layers.Dense(64, activation='relu', input_shape=[len(train_dataset.keys())]),\n",
    "    layers.Dense(64, activation='relu'),\n",
    "    layers.Dense(1)\n",
    "  ])\n",
    "\n",
    "  model.compile(loss='mse',\n",
    "                optimizer=tf.keras.optimizers.RMSprop(0.001),\n",
    "                metrics=['mae', 'mse'])\n",
    "  return model\n",
    "\n",
    "model = build_model()\n",
    "model.summary()\n",
    "\n",
    "# 2. 训练模型\n",
    "EPOCHS = 1000\n",
    "\n",
    "history = model.fit(\n",
    "  normed_train_data, train_labels,\n",
    "  epochs=EPOCHS, validation_split = 0.2, verbose=0,\n",
    "  callbacks=[tfdocs.modeling.EpochDots()])\n",
    "hist = pd.DataFrame(history.history)\n",
    "hist['epoch'] = history.epoch\n",
    "hist.tail() # 可视化训练过程\n",
    "\n",
    "plotter = tfdocs.plots.HistoryPlotter(smoothing_std=2)\n",
    "plotter.plot({'Basic': history}, metric = \"mae\")\n",
    "plt.ylim([0, 10])\n",
    "plt.ylabel('MAE [MPG]')\n",
    "plotter.plot({'Basic': history}, metric = \"mse\")\n",
    "plt.ylim([0, 20])\n",
    "plt.ylabel('MSE [MPG^2]')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "\n",
      "Epoch: 0, loss:562.1896,  mae:22.3224,  mse:562.1896,  val_loss:549.6937,  val_mae:21.9189,  val_mse:549.6937,  \n",
      ".................................................78/78 - 2s - loss: 5.8830 - mae: 1.8677 - mse: 5.8830\n",
      "Testing set Mean Abs Error:  1.87 MPG\n"
     ]
    },
    {
     "data": {
      "image/png": "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xo3j6aefZsKEQ1/x4S1atKh4/0svvbQ4sQL89Kc/JS4ujq5du9KlSxdWrFgBwNixY0lNTSU5OZlzzz23zD5FBg0aRPv27YmLiyMzM5N169axYsUKunTpUtxnvrqJv3R5fPnll4wYMYJevXoxe/bsMuVW2rnnngtA//79WbduXbXOVx7d8Qeh00nw7v/4uv3jRkNKG1/dM+CKoCOTaFHJnfmh9tfhg0oHDhzgmmuu4eOPP6ZDhw7ccccdZfqUN27cuNz9Jk6cyJ133sno0aPp378/qamp5W533HHHMW3aNKZMmUJaWho5OTmVxlS6e+OhXR2L5itaXlrDhg2Lp+Pj48nPz+do32FSujwmT57MvHnz6NOnD7NmzSI7O7vcfYriKIrhaOmOPwgdBoPF+we5zEL1/Lrjl+hUlORbtWrFnj17eO6556q0X1JSEuPHj2fatGlcfvnl5W7z8ssvFyfa1atXEx8fT/PmzWnSpAm7d+8u3u6kk05izpw5AMyePZvhw4cXr3v22WcpLCxkzZo1rF27lowM/+6nN954gx9++IH9+/czb948hg0bVqW4u3fvztq1a4vvvJ955pkq7Vee3bt307ZtW/Ly8pg9e3aNj1NduuMPQsMmMPQaOKann+84FL56EXZugmbtgo1N5AgOreOfMGECd999N1OmTKFXr16kp6czcODAKh/vkksu4fnnn2fcuHHlrn/yySeZPn06jRo1IiEhgdmzZxMfH88ZZ5zBeeedx4svvsif//xnHnzwQa644gruuece0tLSmDlzZvExMjIyGDlyJFu2bOHhhx8mKSkJgOHDhzN16lTWrVvHxRdffFj9fkWSk5P5y1/+woQJE2jVqhWDBg2q8t97qN/+9rcMHjyYTp060atXrzIXszrlnIv4T7du3Vy9tukT537T1LkvnqvWbgsWLKibeKJYfS6Tr776qsb77tq1qxYjqT333HOPu/322+vs+JMmTXLPPvvsYctnzpzprr322hqXy+7du51zzhUWFrpp06a5++6776jirA3l/fsAPnbl5FTd8Qdpz1bAoE0vSGzs6/l7Tgw6KpGwOOecc1izZg1vvfVW0KFU2yOPPMLjjz9Obm4uffv25aqrrgo6pGpR4g/KgV3wPxkw8peQdQt0GKh6fokpL7zwQp2fY9asWeUunzx5MpMnT65x1cr06dOZPn36UUQW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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 改变model，在验证得分没有提高的情况下自动停止训练，使用 EarlyStooping 回调来测试每个时期的训练条件\n",
    "model = build_model()\n",
    "\n",
    "early_stop = keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)\n",
    "\n",
    "early_history = model.fit(normed_train_data, train_labels, \n",
    "                    epochs=EPOCHS, validation_split = 0.2, verbose=0, \n",
    "                    callbacks=[early_stop, tfdocs.modeling.EpochDots()])\n",
    "\n",
    "plotter.plot({'Early Stopping': early_history}, metric = \"mae\")\n",
    "plt.ylim([0, 10])\n",
    "plt.ylabel('MAE [MPG]')\n",
    "\n",
    "loss, mae, mse = model.evaluate(normed_test_data, test_labels, verbose=2)\n",
    "\n",
    "print(\"Testing set Mean Abs Error: {:5.2f} MPG\".format(mae))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 3. 做出预测\n",
    "test_predictions = model.predict(normed_test_data).flatten()\n",
    "\n",
    "a = plt.axes(aspect='equal')\n",
    "plt.scatter(test_labels, test_predictions)\n",
    "plt.xlabel('True Values [MPG]')\n",
    "plt.ylabel('Predictions [MPG]')\n",
    "lims = [0, 50]\n",
    "plt.xlim(lims)\n",
    "plt.ylim(lims)\n",
    "_ = plt.plot(lims, lims)\n",
    "\n",
    "error = test_predictions - test_labels\n",
    "plt.hist(error, bins = 25)\n",
    "plt.xlabel(\"Prediction Error [MPG]\")\n",
    "_ = plt.ylabel(\"Count\")"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.6rc1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
